<?php
/**
 * Записывает шаблоны валидаторов в файл /transalte/*MessagesTemplate.php
 * Для возможности их дальнейшего обноружения сканером трансляции.
 * 
 * @author nrnwest@gmail.com
 *
 */
class Arm_Translate_ValidateTemplate
{
    const SEARSH_LIBRARY = 'library';
    const SEARSH_MODULE  = 'module';
    
    /**
     * Где проводим поиск в библиотеках или модулях
     * @var string
     */
    private $_searshIn = null;
    
    /**
     * Названия библиотеки или модуля.
     * @var string
     */
    private $_name = null;
    
    /**
     * Классы билиотеки zend Которые тоже содержат шаблоны сообщений.
     * @var array
     */
    private $_zendAddClass = array('Zend_Captcha_Word', 'Zend_Captcha_ReCaptcha');
    
    /**
     * Масив с путями к валидаторам с которых нужно получить 
     * шаблоны сообщдений.
     * 
     * @var array
     */
    private $_validates = array();
    
    /**
     * Конструктор
     * @param string $searshIn library|module
     * @param string $name Zend|Arm|User
     */
    public function __construct($searshIn = self::SEARSH_LIBRARY, $name)
    {
      $this->_searshIn = strtolower($searshIn);
      $this->_name     = ucfirst(strtolower($name));
      $this->_validates = $this->_setValidates();
    }
    
    /**
     * Вернет масив который будет содержать обнаруженные валидаторы
     * 
     * @return array|false
     */
    protected function _setValidates()
    {
        if($this->_searshIn === self::SEARSH_LIBRARY) {
            if($this->_name === 'Zend') {
                $class = new Zend_Reflection_Class('Zend_Validate_Abstract');
                $dir   = rtrim(dirname($class->getFileName()) . DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
            } else {
                $dir   = Arm_Core::getPathLibrary() . $this->_name . DIRECTORY_SEPARATOR . 'Validate' . DIRECTORY_SEPARATOR;
            }  
        } else {
            $dir = Arm_Core::getPathModule($this->_name) . 'validates' . DIRECTORY_SEPARATOR;
        }
        
        if(false === is_dir($dir) and $this->_searshIn === self::SEARSH_LIBRARY) {
            throw new Arm_Translate_Exception(Arm_Translate::_('Вы ошиблись в имени библиотеки %s', $this->_name));
        }
        if(false === is_dir($dir) and $this->_searshIn === self::SEARSH_MODULE) {
            throw new Arm_Translate_Exception(Arm_Translate::_('Вы ошиблись в имени модуля %s', $this->_name));
        }
        
        return glob($dir  . '*.php');
    }
    
    /**
     * Вернет путь к результатирующему файлы.
     * 
     * @return path
     */
    protected function _getPathResultFile()
    {
       $file = 'MessagesTemplate.php';
       if($this->_searshIn === self::SEARSH_LIBRARY) {
           $path = Arm_Core::getPathApplication() . 'translate/library/_resource/';
           if(false === is_dir($path)) {
               mkdir($path, 0755);
           }
           $path .= $this->_name . $file;
       } else {
           $path = Arm_Core::getPathModule($this->_name) . 'translate/_resource/';
           if(false === is_dir($path)) {
               mkdir($path, 0755);
           }
           $path .= $file;
       }
       return $path;
    }
    
    /**
     * @todo возможно в дальнейшем переводы интерфейса будут содержатся в базе данных, данный метод
     *       будет записывать результаты своей работы в таблицу.
     * Запишет обнаруженные сообщения валидаторов в файл, или вернет false
     * 
     * @return path|false вернет путь к файлу в которые записанны шаблоны валидаторов, или вернет false
     *         если не обнаруженны валидаторы.
     */
    public function run()
    {
      if($this->_validates === false) {
           return false;
      }
      $result =  '<?php ' . "\n\n" .'return array(' . "\n";
      $validatesClass = array();
      foreach ($this->_validates as $file) {
            $baseName = str_replace('.php', '',  basename($file));
            if($baseName === 'Abstract') {
                continue;
            }
          /*@var $validate Zend_Validate_Abstract */
          $validatesClass[] = $this->_name . '_Validate_' . $baseName;
      }
      
      // Если библиотека Zend добавим классы для сканирования
      if($this->_name === 'Zend' and $this->_searshIn === self::SEARSH_LIBRARY) {
          $validatesClass = array_merge($validatesClass, $this->_zendAddClass);
      }
      
      foreach ($validatesClass as $vClass) {
          $class = new Zend_Reflection_Class($vClass);
          $params = $class->getDefaultProperties();
          if(array_key_exists('_messageTemplates', $params) === false or $params['_messageTemplates'] === array()) {
              continue;
          }
                foreach ($params['_messageTemplates'] as $k=>$v) {
                    $v = addslashes($v);
                    $result .= "'$k'=>Arm_Translate::_('$v'),\n";
                }
      }
      $result .= ");";
      $path = $this->_getPathResultFile();
      file_put_contents($path, $result);
      return $path; 
    }
    
   
}